
package com.x52im.rbchat.logic.chat_guest.utils;

import android.content.Context;
import android.util.Log;

import com.x52im.rainbowchat.im.dto.QuoteMeta;
import com.x52im.rbchat.MyApplication;
import com.x52im.rainbowchat.im.dto.ChatType;
import com.x52im.rainbowchat.im.dto.MsgBody4Guest;
import com.x52im.rainbowchat.im.dto.MsgType;
import com.x52im.rbchat.logic.chat_root.impl.MessageRevokingManager;
import com.x52im.rbchat.logic.chat_root.model.Message;
import com.x52im.rbchat.logic.chat_friend.utils.ChatDataHelper;
import com.x52im.rbchat.logic.chat_root.model.MessageExt;
import com.x52im.rbchat.utils.NotificationPromptHelper;
import com.x52im.rbchat.utils.PromtHelper;
import com.x52im.rbchat.utils.PreferencesToolkits;
import com.x52im.rbchat.utils.ToolKits;

/**
 * 本类的中的方法全面参考自一对一好友聊天的ChatHelper.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 * @since 2.2
 * @see ChatDataHelper
 */
public class TChatDataHelper
{
	private final static String TAG = TChatDataHelper.class.getSimpleName();

    // **************************************************************************** 以下方法仅为本收到的消息所准备 START
	/**
	 * 添加一条临时聊天消息到临时聊天数据结构中.
	 * 
	 * @param context
	 * @param showNotification
	 * @param quoteMeta 消息引用信息（当前仅用于文本消息时），此字段可为空（表示本条无引用消息）
	 */
	public static void addChatMessageData_incoming(Context context, String fingerPrint
			, MsgBody4Guest tcmd, long time, boolean showNotification, boolean playPromtAudio, QuoteMeta quoteMeta)
	{
		int msgType = tcmd.getTy();

		// 如果收到的消息"撤回指令"，则需要单独特殊处理（因为"撤回"指令不是普通的聊天消息哦）
		if(msgType == MsgType.TYPE_REVOKE){

			Log.i(TAG, "【这是消息撤回指令，马上处理撤回逻辑】 ==> msgType="+msgType+"，fingerPrint = "+fingerPrint+"，messageContent="+tcmd.getM());

			// 开始处理撤回指令完整逻辑
			MessageRevokingManager.processRevokeMessage_incoming(ChatType.CHAT_TYPE_GUEST$CHAT, fingerPrint, tcmd.getF(), tcmd.getM());

			// 更新首页消息列表中的显示
			MyApplication.getInstance(context).getIMClientManager().getAlarmsProvider().addATempChatMsgAlarm(context
					, tcmd.getTy(), tcmd.getF(), tcmd.getNickName()
					, tcmd.getM(), time, 0 // 未读数 TODO: 未来做到极致优化：如果该被撤回的消息处于未读数中则将未读数-1// 未读数 TODO: 未来做到极致优化：如果该被撤回的消息处于未读数中则将未读数-1
			);
			return;
		}

		//***************************************************************** 加入数据结构中
		Message cme = MessageExt.prepareChatMessageData_incoming(
						tcmd.getF()
						, tcmd.getNickName()
						, tcmd.getM()
						, context
						, time<=0? ToolKits.getTimeStamp():time
						, tcmd.getTy());
		if(cme != null) {
			// 消息的指纹码（也就是唯一ID啦）
			cme.setFingerPrintOfProtocal(fingerPrint);
			// 尝试设置引用的消息信息（quoteMeta为null则表示无引用消息则）
			cme.setQuoteMeta(quoteMeta);
			// 将消息放入数据结构
			MyApplication.getInstance(context).getIMClientManager().getMessagesProvider().putMessage(context, tcmd.getF(), cme);
		}

		//***************************************************************** 声音提示
		if(playPromtAudio && PreferencesToolkits.isChatMsgToneOpen(context, tcmd.getF()))
			// 来一个声音提示
			PromtHelper.messagePromt(context);
		
		//***************************************************************** 首页消息和系统Notification提示
		int flagNumToAdd = 0;
		// 当前临时聊天的界面处于后台时的消息提示
		if(MyApplication.getInstance(context).getIMClientManager().getCurrentFrontTempChattingUserUID() == null
				|| !MyApplication.getInstance(context).getIMClientManager().getCurrentFrontTempChattingUserUID().equals(tcmd.getF()))
		{
			// 未读消息数+1（当且仅当聊天界面处于后台时）
			flagNumToAdd += 1;
			// 系统Nitification通知
			if(showNotification && PreferencesToolkits.isChatMsgToneOpen(context, tcmd.getF())) {
				// 来一个通知哦
				NotificationPromptHelper.showATempChatMsgNotivication(context,tcmd.getTy(), tcmd.getM(), tcmd.getF(), tcmd.getNickName());
			}
		}

		// 无条件加一个提示到首页消息列表中（就像主流IM微信一样，可以很方便的找到最近聊天的人）
		MyApplication.getInstance(context).getIMClientManager().getAlarmsProvider().addATempChatMsgAlarm(context
					, tcmd.getTy(), tcmd.getF(), tcmd.getNickName()
					, tcmd.getM(), time, flagNumToAdd // 未读临时消息数+1
				);
	}
    // **************************************************************************** 以下方法仅为本收到的消息所准备 END


	// **************************************************************************** 以下方法仅为聊时聊天准备 START
	public static Message addChatMessageData_outgoing(Context context, String friendUid, Message entity)
	{
		// 将一条消息放到该好友的消息列表中（放进去时会自动通知列表的观察者，而观察者将会实现ui的刷新）
		// ，不推荐像上面被注释地代码样直接操作消息列表数据集合，因为通过putMessage(..)方法可以通知观察者
		// 完成ui的刷新等工作，这样能提升编码的质量并统一该项业务的实现
		MyApplication.getInstance(context).getIMClientManager().getMessagesProvider().putMessage(context, friendUid, entity);
		return entity;
	}
}
